import http from 'http'
import fs from 'fs'
import path from 'path'

/**
 * 创建静态文件服务器
 * @param {string|Object} staticPath - 静态文件目录路径或路径映射对象
 * @param {number} port - 服务器端口
 * @returns {Object} - 包含服务器实例和启动方法的对象
 */
function createStaticServer(staticPath, port = 8888) {
  // 如果是字符串，转换为默认路径映射
  const pathMappings = typeof staticPath === 'string' ? { '/': staticPath } : staticPath

  const server = http.createServer((req, res) => {
    // 获取请求的文件路径
    let filePath = req.url === '/' ? '/index.html' : req.url

    // 查找匹配的路径映射 - 按路径长度排序，优先匹配更具体的路径
    let fullPath = null
    let matchedPrefix = null

    // 获取所有路径前缀，按长度降序排序（最长的先匹配）
    const sortedPrefixes = Object.keys(pathMappings).sort((a, b) => b.length - a.length)

    for (const prefix of sortedPrefixes) {
      const basePath = pathMappings[prefix]

      if (prefix !== '/' && filePath.startsWith(prefix)) {
        // 匹配具体的路径前缀
        matchedPrefix = prefix
        let relativePath = filePath.substring(prefix.length)

        // 如果相对路径为空或只是 '/'，则默认为 index.html
        if (!relativePath || relativePath === '/') {
          relativePath = '/index.html'
        }

        fullPath = path.join(basePath, relativePath)
        break
      } else if (
        prefix === '/' &&
        !sortedPrefixes.some((p) => p !== '/' && filePath.startsWith(p))
      ) {
        // 只有当没有其他具体路径匹配时，才使用根路径
        matchedPrefix = prefix
        fullPath = path.join(basePath, filePath)
        break
      }
    }

    // 如果没有匹配到任何路径，使用默认路径
    if (!fullPath) {
      const defaultPath = pathMappings['/'] || Object.values(pathMappings)[0]
      fullPath = path.join(defaultPath, filePath)
      matchedPrefix = '/'
    }

    // 检查文件是否存在
    fs.readFile(fullPath, (err, data) => {
      if (err) {
        res.statusCode = 404
        res.end('<h1>File not found</h1>')
        return
      }

      // 设置正确的Content-Type
      const ext = path.extname(filePath)
      const contentType =
        {
          '.html': 'text/html',
          '.js': 'text/javascript',
          '.css': 'text/css',
          '.json': 'application/json',
          '.png': 'image/png',
          '.jpg': 'image/jpeg',
          '.gif': 'image/gif',
          '.svg': 'image/svg+xml',
          '.ico': 'image/x-icon'
        }[ext] || 'text/plain'

      res.statusCode = 200
      res.setHeader('Content-Type', contentType)
      res.end(data)
    })
  })

  return {
    server,
    port,
    start() {
      return new Promise((resolve, reject) => {
        server.listen(port, (err) => {
          if (err) {
            reject(err)
          } else {
            console.log(`Server running on port ${port}`)
            resolve()
          }
        })
      })
    },
    stop() {
      return new Promise((resolve) => {
        server.close(resolve)
      })
    }
  }
}

export { createStaticServer }
